Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
15-07-2026

Inwerkingtreding:
16-07-2026

19.3 Liquiditeit - wat is de werkkapitaalratio?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: Zorgkantoren 19.3.0
2# Parameters: ?peildatum
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-fin: <http://purl.org/ozo/onz-fin#>
6PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
7PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
8
9SELECT
10    ("Werkkapitaalratio" AS ?Kental)
11    (
12        IF(
13            BOUND(?p_totaal) && (?p_totaal != 0),
14            ROUND((xsd:decimal(?werkkapitaal_op_korte_termijn) / xsd:decimal(?p_totaal)) * 100) / 100,
15            "Ongedefinieerd"
16        ) AS ?Waarde
17	)
18WHERE {
19    #DEEL 1: Werkkapitaal op korte termijn
20    {
21        SELECT
22        	(
23                SUM(IF(?jaarrekeningpost = "B Vlottende activa", ?Bedrag, 0)) -
24                SUM(IF(?jaarrekeningpost = "G Kortlopende schulden (ten hoogste 1 jaar)", ?Bedrag, 0)) 
25                AS ?werkkapitaal_op_korte_termijn
26        	)
27        WHERE {
28            SELECT
29                ?jaarrekeningpost
30                (IF(SUM(?heeftData) > 0, SUM(?bedrag_rubriek), 0) AS ?Bedrag)
31            WHERE { 
32                { # Subquery 1: Jaarrekeningposten 
33                    {	# Middle select: Bereken het totaal per rubriek (saldo + latere mutaties)
34                        SELECT  
35                            ?rubriek ?jaarrekeningpost_child 
36                            (SUM(?geld_bedrag_post) + SUM(?saldo_waarde)/COUNT(?saldo_waarde) AS ?bedrag_rubriek)
37                        	(IF(COUNT(?heeftBeginsaldo) + COUNT(?heeftGrootboekPost) = 0, 0, 1) AS ?heeftData) 
38                        WHERE {
39                            {	# Innermost select: 
40                                #  - Haal het meest recente saldo per rubriek op als beginsaldo, 0 indien geen saldo in data
41                                #  - Haal de bijbehorende datum op om alle posten na beginsaldo bij toe te voegen
42                                SELECT  
43                                    ?rubriek ?jaarrekeningpost_child
44                                    (IF(BOUND(?saldo_bedrag), ?saldo_bedrag, 0) AS ?saldo_waarde)
45                                    ?peildatum_argument
46                                    (IF(BOUND(?saldo_datum), ?saldo_datum, ?unbound) AS ?begin_datum)
47                                    ?saldo_datum ?saldo ?heeftBeginsaldo
48                                WHERE { 
49                                    # BIND("2024-12-31"^^xsd:date AS ?peildatum)
50                                    BIND(?peildatum as ?peildatum_argument)
51
52                                    # Bind jaarrekeningpost_child(jaarrekening subpost)op basis van rubriekCode
53                                    # Deze code gaat ervan uit dat alle prismant codes die met cijfers beginnen en 6 cijfers hebben
54                                    # Er bestaan ook codes die eruit zien als onz-fin:rubriek05
55                                    # deze nemen we bewust niet mee (want dat zijn verzamelniveaus)
56                                    {
57                                        # Prismant: prefix-mapping, want Prismant consolideert niet dus we willen onderliggende rubrieken
58                                        {
59                                            ?rubriek a onz-fin:Grootboekrubriek .
60                                        }
61                                        UNION
62                                        {
63                                            ?rubriek a onz-fin:Grootboekrekening .
64                                            # in de testdata is deze branch overbodig, voor de zekerheid laten staan omdat in werkelijkheid 
65                                            # de codes waarschijnlijk grootboekrekeningen zijn 
66                                        }
67                                        BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
68
69                                        VALUES (?prismantPrefix ?jaarrekeningpost_child) {
70                                            ("3"     "B.I")
71                                            ("12"    "B.II")
72                                            ("131"   "B.III")
73                                            ("132"   "B.IV")
74
75                                            ("14"    "G")
76                                            ("15"    "G")
77                                        }
78                                        FILTER(STRSTARTS(?rubriekCode, ?prismantPrefix))
79                                    }
80                                    UNION
81                                    {
82                                        # RGS: exacte mapping, want RGS consolideert zelf onderliggende rubrieken
83                                        # Dit houdt in dat rubrieken naast de directe boekingen ook de totaaltelling
84                                        # van alle boekingen op alle onderliggende rubrieken bevatten (algemene uitgangspunten)BELANGRIJK  
85                                        # We willen dus niet dubbel tellen en vandaar exacte match
86                                        VALUES (?rubriekCode ?jaarrekeningpost_child) {
87                                            ("BVrd"    "B.I")
88                                            ("BPro"    "B.I")
89                                            ("BObd"    "B.I")
90                                            ("BVor"    "B.II")
91                                            ("BVfi"    "B.II")
92                                            ("BEff"    "B.III")
93                                            ("BLim"    "B.IV")
94
95                                            ("BSch"    "G")
96                                        }
97
98                                        BIND(IRI(CONCAT(STR(onz-fin:), ?rubriekCode)) AS ?rubriek)
99                                        {
100                                            ?rubriek a onz-fin:Grootboekrubriek .
101                                        }
102                                        UNION
103                                        {
104                                            ?rubriek a onz-fin:Grootboekrekening .
105                                        }
106                                    }
107
108                                    OPTIONAL {
109                                        ?rubriek onz-g:isAbout ?saldo .
110                                        ?saldo
111                                            a onz-fin:EindSaldo ;
112                                            onz-fin:heeftGeldBedrag ?saldo_bedrag ;
113                                            onz-g:hasDate ?saldo_datum .
114
115                                        FILTER (?saldo_datum <= ?peildatum_argument)
116
117                                        FILTER NOT EXISTS {  
118                                            ?rubriek onz-g:isAbout ?saldo2 .
119                                            ?saldo2
120                                                a onz-fin:EindSaldo ;
121                                            	onz-g:hasDate ?saldo_datum2 .
122
123                                            FILTER(?saldo2 != ?saldo)
124                                            FILTER(?saldo_datum2 <= ?peildatum_argument)
125                                            FILTER(
126                                                ?saldo_datum2 > ?saldo_datum || 
127                                                (
128                                                    ?saldo_datum2 = ?saldo_datum 
129                                                    && STR(?saldo2) > STR(?saldo)
130                                                )
131                                            )
132                                        }
133                                    }
134                                    # Bind alleen als er een saldo in de data aanwezig was
135                                    BIND(IF(BOUND(?saldo_bedrag), 1, ?unbound) AS ?heeftBeginsaldo)  
136
137                                }
138                            } # End of innermost query: Alle aanwezige beginsaldos zijn gevonden
139
140                            # Selecteer de bijbehorende grootboekpost bij de rubriek 
141                            OPTIONAL {  
142                                ?grootboek_post
143                                    a onz-fin:Grootboekpost ;
144                                    onz-g:partOf ?rubriek ;
145                                    onz-g:hasDate ?datum ;
146                                    onz-fin:heeftGeldBedrag ?geld_bedrag_temp .
147                                # Behoud de grootboek post alleen voor de meest specifieke rubriek, 
148                                # om dubbeltelling bij meerdere rubrieken te voorkomen
149                                FILTER NOT EXISTS {
150                                    ?grootboek_post onz-g:partOf ?specifiekereRubriek .
151                                    ?specifiekereRubriek onz-g:partOf+ ?rubriek .
152                                }
153                                FILTER (?datum <= ?peildatum_argument && (?datum > ?begin_datum || !BOUND(?begin_datum)))
154                                BIND (1 AS ?heeftGrootboekPost)
155                            }
156                            BIND(IF(BOUND(?geld_bedrag_temp), ?geld_bedrag_temp, 0) AS ?geld_bedrag_post)
157
158                        } GROUP BY ?rubriek ?jaarrekeningpost_child 
159                    } # End of middle query: Alle beginsaldos + transacties daarna zijn gevonden (eindtotaal bekend)
160
161                    # De rest van subquery 1 breidt de jaarrekeningposten uit met hun bijbehorende totaal posten
162                    VALUES (?jaarrekeningpost_child ?jaarrekeningpost_child_uitgebreid) {
163                        ("B.I"    "B.I Voorraden")
164                        ("B.II"   "B.II Vorderingen")
165                        ("B.III"  "B.III Effecten")
166                        ("B.IV"   "B.IV Liquide middelen")
167
168                        ("G"      "G Kortlopende schulden (ten hoogste 1 jaar)")
169                    }
170
171                    BIND(
172                        IF(STRSTARTS(?jaarrekeningpost_child, "B."), "B Vlottende activa",
173                        ?unbound) AS ?jaarrekeningpost_parent # Fallback naar ?unbound om dubbeltelling te voorkomen
174                    )
175
176                    VALUES ?x {1 2 3}
177                    BIND(
178                        IF(?x = 1, ?jaarrekeningpost_child_uitgebreid,
179                        IF(?x = 2, ?jaarrekeningpost_parent,
180                        IF(?x = 3, ?jaarrekeningpost_grandparent, 
181                        ?unbound))) AS ?jaarrekeningpost
182                    )
183
184                    FILTER(BOUND(?jaarrekeningpost))
185
186                } # End of subquery 1: Alle totalen voor de aanwezige jaarrekeningposten zijn bepaald (inclusief de overkoepelende jaarrekeningposten)  
187                UNION
188                { # Subquery 2: Initieer alle jaarrekeningposten met bedrag=0
189
190                    VALUES ?jaarrekeningpost {
191                        "B.I Voorraden"
192                        "B.II Vorderingen"
193                        "B.III Effecten"
194                        "B.IV Liquide middelen"
195                        "B Vlottende activa"
196
197                        "G Kortlopende schulden (ten hoogste 1 jaar)"
198                    }
199
200                    BIND(0 AS ?bedrag_rubriek)
201                    BIND(0 AS ?heeftData)  # Tijdens initieren is het nog onduidelijk of er data voor de rubriek aanwezig is
202                }
203
204            } GROUP BY ?jaarrekeningpost 
205            ORDER BY ?jaarrekeningpost
206        }
207    }
208
209    # DEEL 2: P totaal berekenen
210    {
211        SELECT 
212        	(SUM(?p_bedrag) AS ?p_totaal)
213        WHERE {
214            #BIND("2024-12-31"^^xsd:date AS ?peildatum)
215            BIND(
216                IF(
217                    MONTH(?peildatum) = 12 && DAY(?peildatum) = 31,
218                    xsd:date(CONCAT(STR(YEAR(?peildatum)), "-01-01")),
219                    xsd:date(CONCAT(STR(YEAR(?peildatum)-1), "-07-01"))
220                )
221                AS ?startperiode)
222            BIND(?peildatum AS ?eindperiode)
223
224            # Koppel grootboekposten aan rubrieken binnen meetperiode
225            ?grootboek_post 
226                a onz-fin:Grootboekpost ;
227                onz-g:partOf ?rubriek ;
228                onz-g:hasDate ?datum ;
229                onz-fin:heeftGeldBedrag ?geld_bedrag .
230
231            # Match directe ouder: Grootboekrekening (RGS) of Grootboekrubriek (Prismant)
232            {
233                { ?rubriek a onz-fin:Grootboekrekening }
234                UNION
235                { ?rubriek a onz-fin:Grootboekrubriek }
236            }
237            # Anti-dubbeltelling: houd alleen het bladniveau (geen transitive ancestors)
238            FILTER NOT EXISTS 
239            {
240                ?grootboek_post onz-g:partOf ?specifiekereRubriek .
241                ?specifiekereRubriek onz-g:partOf+ ?rubriek .
242            }
243            FILTER(STRSTARTS(STR(?rubriek), STR(onz-fin:)))
244            BIND(STRAFTER(STR(?rubriek), STR(onz-fin:)) AS ?rubriekCode)
245
246            FILTER (?datum >= ?startperiode && ?datum <= ?eindperiode)
247
248            # P-bedragen
249            BIND(
250                IF(
251                    STRSTARTS(?rubriekCode, "81") ||
252                    STRSTARTS(?rubriekCode, "82") ||
253                    STRSTARTS(?rubriekCode, "83") ||
254                    STRSTARTS(?rubriekCode, "89") ||
255                    STRSTARTS(?rubriekCode, "919") ||
256                    STRSTARTS(?rubriekCode, "920") ||
257                    STRSTARTS(?rubriekCode, "930") ||
258                    STRSTARTS(?rubriekCode, "WOmz") ||
259                    STRSTARTS(?rubriekCode, "WRev") ||
260                    STRSTARTS(?rubriekCode, "WRvi") ||
261                    STRSTARTS(?rubriekCode, "WRgr") ||
262                    STRSTARTS(?rubriekCode, "WWvv") ||
263                    STRSTARTS(?rubriekCode, "WNoa") ||
264                    STRSTARTS(?rubriekCode, "WLbe") ||
265                    STRSTARTS(?rubriekCode, "WBat") ||
266                    STRSTARTS(?rubriekCode, "WWiv") ||
267                    STRSTARTS(?rubriekCode, "WOvb"),
268                    ?geld_bedrag, 0) AS ?p_bedrag
269            )
270        }
271    }
272}
273ORDER BY ?Kental
274